package edu.upn.evolucion.proventas.datos;

import edu.upn.evolucion.proventas.entidades.Cargo;
import edu.upn.evolucion.proventas.entidades.Cliente;
import edu.upn.evolucion.proventas.entidades.Empleado;
import edu.upn.evolucion.proventas.entidades.Telefono;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

public class EmpleadoDAO {
    private static EmpleadoDAO instancia;

    private EmpleadoDAO() {
    }

    public static EmpleadoDAO obtenerInstancia() {
        if (instancia == null) {
            instancia = new EmpleadoDAO();
        }
        return instancia;
    }
    
    public void registrar(Empleado objEmpleado) {
        Connection con = ConnectionManager.getConnection();
        try {
            
            //2. Crear Statement JDBC
            Statement stmt = con.createStatement();
            //3. Crear Sentencias SQL
            String insert = ""
                    + "INSERT INTO empleado(nombre, apellidoPaterno, apellidoMaterno, password, direccion, email, cargo, sueldo) "
                    + "VALUES(" 
                    + "'" + objEmpleado.getNombre() + "', "
                    + "'" + objEmpleado.getApellidoPaterno() + "', "
                    + "'" + objEmpleado.getApellidoMaterno() + "', "
                    + "'" + objEmpleado.getPassword() + "', "
                    + "'" + objEmpleado.getDireccion() + "', "
                    + "'" + objEmpleado.getEmail() + "', "
                    + "'" + objEmpleado.getCargo() + "', "
                    +  objEmpleado.getSueldo() + ")";
            stmt.executeUpdate(insert);
            for(Telefono t : objEmpleado.objTelefono){
                //System.out.println(“Nombre del Empleado: ” + tmpObjeto.getNombre());
                insert = ""
                    + "INSERT INTO telefonoEmpleado (numero, descripcion, idEmpleado) "
                    + "VALUES(" 
                    + "'" + t.getNumero() + "', "
                    + "'" + t.getDescripcion() + "', "
                    + "(SELECT MAX(id) AS id FROM empleado))";
                stmt.executeUpdate(insert);
            }
            //4. ResultSet
            //5. Cerrar conexion
            stmt.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
        }
    }
    
    public void modificar(Empleado objEmpleado) {
        Connection con = ConnectionManager.getConnection();
        try {
            
            //2. Crear Statement JDBC
            Statement stmt = con.createStatement();
            //3. Crear Sentencias SQL
            String update = ""
                    + "update empleado set "
                    + "nombre = '" + objEmpleado.getNombre() + "', "
                    + "apellidoPaterno = '" + objEmpleado.getApellidoPaterno() + "', "
                    + "apellidoMaterno = '" + objEmpleado.getApellidoMaterno() + "', "
                    + "direccion = '" + objEmpleado.getDireccion() + "', "
                    + "email = '" + objEmpleado.getEmail() + "', "
                    + "sueldo = " + objEmpleado.getSueldo() + ", "
                    + "cargo = '" + objEmpleado.getCargo() + "' where id = " + objEmpleado.getId();
            stmt.executeUpdate(update);
            
            //4. ResultSet
            //5. Cerrar conexion
            stmt.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
        }
    }
    
    public String eliminar(int idEmpleado) {
        
        Connection con = ConnectionManager.getConnection();
        try {
            
            //2. Crear Statement JDBC
            Statement stmt = con.createStatement();
            //3. Crear Sentencias SQL
            //String delete = "delete from telefonoEmpleado where idEmpleado = " + idEmpleado;
            //stmt.executeUpdate(delete); 
            
            String delete = "delete from Empleado where id = " + idEmpleado;
            stmt.executeUpdate(delete); 
            
            //5. Cerrar conexion
            stmt.close();
            return "Cliente eliminado"; 
        } catch (Exception e) {
            e.printStackTrace();
            return "Error al eliminar cliente"; 
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
        }
    }
    
    public ArrayList<Empleado> buscar(Empleado objEmpleado) {
        Connection con = ConnectionManager.getConnection();
        try {
            
            //2. Crear Statement JDBC
            Statement stmt = con.createStatement();
            //3. Crear Sentencias SQL
            //Un objeto ResultSet, almacena los datos de resultados de una consulta
            ResultSet tabla = stmt.executeQuery("SELECT e.id, e.nombre, e.apellidoPaterno, e.apellidoMaterno, e.direccion, e.email, e.sueldo, e.password, e.cargo"
                                            + " FROM Empleado e "
                                            + "WHERE e.nombre like '%"+objEmpleado.getNombre() +"%' ORDER BY e.id");
            
         
            //System.out.println("Codigo\tNombre");
            ArrayList<Empleado> coleccion = new ArrayList<Empleado>();
            while(tabla.next()){
                Empleado obj = new Empleado();
                obj.setId(tabla.getInt(1));
                obj.setNombre(tabla.getString(2));
                obj.setApellidoPaterno(tabla.getString(3));
                obj.setApellidoMaterno(tabla.getString(4));
                obj.setDireccion(tabla.getString(5));
                obj.setEmail(tabla.getString(6));
                obj.setSueldo(tabla.getBigDecimal(7));
                obj.setPassword(tabla.getString(8));
                obj.setCargo(tabla.getString(9));
                coleccion.add(obj);
                //System.out.println(tabla.getInt(1)+"\t"+tabla.getString(2));
            }
            //4. ResultSet
            //5. Cerrar conexion
            stmt.close();
            return coleccion;
        } catch (Exception e) {
            e.printStackTrace(); 
            ArrayList<Empleado> c = new ArrayList<Empleado>();
            return c;
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
        }
    }
    
    public ArrayList<Empleado> buscar(int idEmpleado) {
        Connection con = ConnectionManager.getConnection();
        try {
            
            //2. Crear Statement JDBC
            Statement stmt = con.createStatement();
            //3. Crear Sentencias SQL
            //Un objeto ResultSet, almacena los datos de resultados de una consulta
            ResultSet tabla = stmt.executeQuery("SELECT e.id, e.nombre, e.apellidoPaterno, e.apellidoMaterno, e.direccion, e.email, e.sueldo, e.password "
                                            + "FROM Empleado e "
                                            + "WHERE e.id = " + idEmpleado + " ORDER BY e.id");
            
            //System.out.println("Codigo\tNombre");
            ArrayList<Empleado> coleccion = new ArrayList<Empleado>();
            while(tabla.next()){
                Empleado obj = new Empleado();
                obj.setId(tabla.getInt(1));
                obj.setNombre(tabla.getString(2));
                obj.setApellidoPaterno(tabla.getString(3));
                obj.setApellidoMaterno(tabla.getString(4));
                obj.setDireccion(tabla.getString(5));
                obj.setEmail(tabla.getString(6));
                obj.setSueldo(tabla.getBigDecimal(7));
                obj.setPassword(tabla.getString(8));
                coleccion.add(obj);
                //System.out.println(tabla.getInt(1)+"\t"+tabla.getString(2));
            }
            //4. ResultSet
            //5. Cerrar conexion
            stmt.close();
            return coleccion;
        } catch (Exception e) {
            e.printStackTrace(); 
            ArrayList<Empleado> c = new ArrayList<Empleado>();
            return c;
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
        }
    }
    public ArrayList<Empleado> buscar() {
        Connection con = ConnectionManager.getConnection();
        try {
            
            //2. Crear Statement JDBC
            Statement stmt = con.createStatement();
            //3. Crear Sentencias SQL
            //Un objeto ResultSet, almacena los datos de resultados de una consulta
            ResultSet tabla = stmt.executeQuery("SELECT e.id, e.nombre, e.apellidoPaterno, e.apellidoMaterno, e.direccion, e.email, e.sueldo, e.password "
                                            + "FROM Empleado e "
                                            + "ORDER BY e.id");
            
            //System.out.println("Codigo\tNombre");
            ArrayList<Empleado> coleccion = new ArrayList<Empleado>();
            while(tabla.next()){
                Empleado obj = new Empleado();
                obj.setId(tabla.getInt(1));
                obj.setNombre(tabla.getString(2));
                obj.setApellidoPaterno(tabla.getString(3));
                obj.setApellidoMaterno(tabla.getString(4));
                obj.setDireccion(tabla.getString(5));
                obj.setEmail(tabla.getString(6));
                obj.setSueldo(tabla.getBigDecimal(7));
                obj.setPassword(tabla.getString(8));
                coleccion.add(obj);
                //System.out.println(tabla.getInt(1)+"\t"+tabla.getString(2));
            }
            //4. ResultSet
            //5. Cerrar conexion
            stmt.close();
            return coleccion;
        } catch (Exception e) {
            e.printStackTrace(); 
            ArrayList<Empleado> c = new ArrayList<Empleado>();
            return c;
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
        }
    }
}
